/* led_effect.c - LED效果实现 */
#include "led_effect.h"
#include "esp_bt.h"
#include "esp_hf_client_api.h"
#include "esp_log.h"
#include "driver/rmt_tx.h"
#include "led_strip.h"

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

static const char *TAG = "LED";
static led_strip_handle_t led_strip;      // LED灯带句柄
static led_state_t current_state = LED_STATE_UNPAIRED; // 当前状态
static uint32_t hue = 0;                 // 彩虹色调
static uint32_t last_blink = 0;          // 最后闪烁时间戳
static bool blink_toggle = false;        // 闪烁状态切换标志


static music_led_params_t music_params = {50, 0, 0};
// static uint32_t last_music_update = 0;


void led_strip_fill(led_strip_handle_t strip, uint32_t start, uint32_t rgb) {
        led_strip_set_pixel(strip, start, 
                            (rgb >> 16) & 0xFF,  // R
                            (rgb >> 8) & 0xFF,   // G
                            rgb & 0xFF);          // B
    led_strip_refresh(strip); // 刷新显示
}

static void music_spectrum_effect(void) {
    const uint8_t decay = 3; // 衰减速度
    static uint8_t brightness = 0;
    
    // 动态衰减
    if(brightness > decay) brightness -= decay;
    else brightness = 0;
    
    // 根据音频峰值更新亮度
    if(music_params.brightness > brightness) {
        brightness = music_params.brightness;
    }
    
    // 设置HSV颜色
    led_strip_set_pixel_hsv(led_strip, 0, 
                           music_params.hue, 
                           100, // 饱和度
                           brightness);
    led_strip_refresh(led_strip);
}


/* 初始化WS2812驱动 */
void led_init(void) {
    rmt_channel_handle_t led_chan = NULL;
    
    // 配置RMT发送通道
    rmt_tx_channel_config_t tx_chan_config = {
        .clk_src = RMT_CLK_SRC_DEFAULT,  // 时钟源
        .gpio_num = LED_GPIO_NUM,        // GPIO引脚
        .mem_block_symbols = 64,         // 内存块大小
        .resolution_hz = LED_RESOLUTION_HZ, // 10MHz分辨率
        .trans_queue_depth = 4,          // 传输队列深度
    };
    ESP_ERROR_CHECK(rmt_new_tx_channel(&tx_chan_config, &led_chan));

    // 配置LED灯带参数
    led_strip_config_t strip_config = {
        .strip_gpio_num = LED_GPIO_NUM,  // 数据引脚
        .max_leds = LED_NUM_PIXELS,      // 最大LED数量
        .led_model = LED_MODEL_WS2812,
    };
    led_strip_rmt_config_t rmt_config = {
        .clk_src = RMT_CLK_SRC_DEFAULT,  // 时钟源
        .resolution_hz = LED_RESOLUTION_HZ,
        .mem_block_symbols = 64,
    };

    // 创建RMT驱动的LED灯带设备
    ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip));
    ESP_LOGI(TAG, "WS2812初始化完成");
}

/* 设置LED状态（带优先级） */
void led_set_state(led_state_t new_state) {
    // 保持通话状态优先
    if (current_state == LED_STATE_IN_CALL) return;
    current_state = new_state;
    blink_toggle = false;  // 重置闪烁状态
}

/* 彩虹效果生成 */
static void rainbow_effect(void) {
    const uint16_t rainbow_speed = 2; // 彩虹移动速度
    
    // 为每个LED设置HSV颜色（色相分布）
    for (int i = 0; i < LED_NUM_PIXELS; i++) {
        uint32_t pixel_hue = hue + (i * 360 / LED_NUM_PIXELS);
        led_strip_set_pixel_hsv(led_strip, i, pixel_hue % 360, 100,50); // 饱和度100%，亮度50%
    }
    led_strip_refresh(led_strip);  // 刷新显示
    hue = (hue + rainbow_speed) % 360; // 更新色相值
}

/* 未配对状态处理（蓝色呼吸） */
static void handle_unpaired(void) {
    const uint32_t interval_ms = 300; // 呼吸间隔
    
    uint32_t now = xTaskGetTickCount() * portTICK_PERIOD_MS;
    if (now - last_blink > interval_ms) {
        blink_toggle = !blink_toggle;
        uint32_t color = blink_toggle ? 0x0000FF : 0x000000; // 蓝/黑切换
        led_strip_fill(led_strip, 0, color);
        led_strip_refresh(led_strip);
        last_blink = now;
    }
}

/* 通话状态处理（绿色闪烁） */
static void handle_in_call(void) {
    const uint32_t interval_ms = 300; // 闪烁间隔
    
    uint32_t now = xTaskGetTickCount() * portTICK_PERIOD_MS;
    if (now - last_blink > interval_ms) {
        blink_toggle = !blink_toggle;
        uint32_t color = blink_toggle ? 0x00FF00 : 0x000000; // 绿/黑切换
        led_strip_fill(led_strip, 0, color);
        led_strip_refresh(led_strip);
        last_blink = now;
    }
}

/* LED状态更新任务 */
void led_update_task(void *arg)
{
    while (1)
    {
        switch (current_state)
        {
        case LED_STATE_UNPAIRED:
            handle_unpaired(); // 未配对状态
            break;
        case LED_STATE_IN_CALL:
            handle_in_call(); // 通话状态
            break;
        case LED_STATE_MUSIC: // 音乐播放
            music_spectrum_effect();
            break;
        default:              // 空闲状态
            rainbow_effect(); // 彩虹流动
            break;
        }
        vTaskDelay(pdMS_TO_TICKS(20)); // 50ms更新周期
    }
}

void led_set_music_params(uint8_t brightness, uint16_t hue) {
    music_params.brightness = brightness > 100 ? 100 : brightness;
    music_params.hue = hue % 360;
}